package visitor;
import arbori.*;
import operatori.*;
import functii.*;

public class DerivareVisitor extends Visitor{
        private String rezultat;
        Visitor tsv;
        public DerivareVisitor() {
			this.rezultat ="";
		}
	
	public String getRezultat() {
			return rezultat;
		}

		public void setRezultat(String rezultat) {
			this.rezultat = rezultat;
		}

	public DerivareVisitor(String rezultat) {
			this.rezultat = rezultat;
		}

	
	public void visitare(Operator o) {
		if(o.getFStang()!=null&&o.getFDrept()!=null)
		{
		visit(o.getFStang());
		String s1=this.rezultat;
		visit (o.getFDrept());
		 String s2=this.rezultat;
		 rezultat=o.concatTermeni (s1,s2);
		}
		
	}
	
	public void visit(Plus p) {
		visitare(p);
		
	}
	@Override
	public void visit(Minus m) {
		visitare(m);		
	}

	@Override
	public void visit(Cat m) {
		visitare(m);
		
	}

	@Override
	public void visit(Produs p) {
		if(p.getFStang()!=null&&p.getFDrept()!=null)
		{
		visit(p.getFStang());
		String f1D=this.rezultat;
		visit (p.getFDrept());
		 String f2D=this.rezultat;
		 p.getFStang().acceptVisitor(tsv);
		 String f1=tsv.getS();
		 p.getFDrept().acceptVisitor(tsv);
		 String f2=tsv.getS();
		 this.rezultat=Plus.concatTermens(Produs.concatTermens(f1D,f2),Produs.concatTermens(f1,  f2D));
		 
		}
		
	}

	@Override
	public void visit(Necunoscuta n) {
		this.rezultat="1";
		
	}

	@Override
	public void visit(Constanta c) {
		this.rezultat="0";
		
	}

	@Override
	public void visit(Sin s) {
		if(s.getFStang()!=null){
			visit(s.getFStang());
			String fsd=this.rezultat;
			s.getFStang().acceptVisitor(tsv);
			String fs=tsv.getS();
			this.rezultat=Produs.concatTermens(Cos.concatTermens(fs),fsd);
		}
		
	}

	@Override
	public void visit(Cos c) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void visit(Nod n) {
		// TODO Auto-generated method stub
		
	}

}
